Для каждого дерева нужны три модели: обычная, неактивная (с названием Doodads\Terrain\AshenTree\AshenTree0S.mdx, например) и неактивная разрушенная (Doodads\Terrain\AshenTree\AshenTree0D.mdx). У неактивных моделей должна быть только одна анимация — Stand. У первой — только деревце, у второй — только пенёк, соответственно.
Когда с деревом никто не взаимодействует, отображаются неактивные модели. Ты их не заменил, потому такая вот фигня.
Как сделать полноценно работающие деревья с моделями, не заменяющими стандартные, я не знаю. Возможно, никак.
Настраиваешь в РО дерево так чтобы у него была 1 вариация и там текстуру нужно к дереву прописать если она импортирована внимательно изучи все строки связанные с деревом как разрушенный объект.
У меня кончились мыслИ. Привязку к точкам всё что могу тут предложить, а жаль...
ХОТЯ знаешь чё - осенило меня тут - создавай на позиции здания дамик с картой пути в виде буквы О. То есть само здание как бы без текстуры пути, а его огораживает дами с кольцевой текстурой. Таким образом здание никуда не убежит, зато сможет поворачиваться!
Прикрепляю пример. Только себе текстурку поплотнее сделай
Ну чтобы перевести, из градусов в радианы
180° = pi радиан = 3,14...
Если знаешь расположение градусов в окружности (там 2pi = 360°, или pi/2 = 90°)
60° = pi/3 радиан = 3,14/3 = 1,0466
30° = pi/6 радиан = 3,14/6 = 0,5233
Или использовать готовую формулу Angle to Radians => Angle *pi / 180 (формула)
pi/180 = 3,14/180 = 0,01744 (коэффициент, записан в варе в переменную-множитель bj_DEGTORAD)
_________________
Чтобы перевести из радиан в градусы
Использую формулу Radians to Angle => Radians * 180 / pi
1 радиан = 57,32°
0,5 радиан = 0,5 * 180/3,14 = 28,6°
Используют точно также переменную-множитель bj_RADTODEG, но с другим названием. Там было Deg to Rad (перевести в радианы), здесь Rad to Deg (в градусы) тут есть погрешности до десятичных, до сотых и более. Поэтому может не соответствовать. Это как пример. Считал сам. А вообще юзайте готовые переменные и не морочьте голову
код
local unit u = GetTriggerUnit()
local real a = GetUnitFacing(u) * bj_DEGTORAD //GetUitFacing возвращает параметры в градусы, поэтому нужно перевести в радианы
local real x = GetUnitX(u) + 100. * Cos(a)
local real y = GetUnitY(u) + 100. * Sin(a)
//потом то-то делаешь. x, y
xgm.guru/p/wc3/179127тут есть пример карта, на гуи там, но переделать можно и на jass (там кастер двигается в ту сторону, куда смотрит). И пример в качестве кода, если нужно двигать относительно двух точек (сделал пример движение снаряда от Кастера к цели)
фиксировать угол при применении и постоянно выравнивать юнита при периодической проверке
если ставить скорость поворота 0 - у юнита начнутся проблемы с движением
Патиссончик, про центр области не заметил
точка каждый раз создаётся заново и это утечка Патиссончик, есть прога на сайте для записи логов
так же есть дебаг через прелоад на сайте
вот счётчик утечек
Smart096, баг только в этой карте?
в новых картах бага нету?
если да то стоит проверить импортируемые модели и текстуры (мб часть битая)
но с вероятностью в 60% проблема в системе ибо было много жалоб на баги в вин10
Hodorishe, ну во-первых, сделаем сохранение, прежде, чем менять. Во-вторых, выбираем ландшафт ТЦ, ставим галочку на нестандартности, удаляем всё, кроме того, что не удаляется (склоны), копируем из глуши все копируемые тайлы, расставляя их в том же порядке, что и были. Проверяем. У меня изменились только склоны.
Ну разве что с бездной проблемка возникла, ибо она и как склон, и как тайл.
Если еще немного покопатса на сайте в разделе декораций - можно нагрести кучу добра!
И вобще мой вам совет - научитесь минимальному моделингу: сможете клепать такие вещи за 3 минуты на коленке с необходимым вам видом, формой и текстурой.
Sucsonius, через скилы реализовать покупку/продажу юнитов(все действия описывать триггерно, а инфу показывать в мультибоарде)
ещё можно отдать дамми герою приказ на покупку и таким образом уменьшать
можно создать кучу зданий с разным количеством двенадцатого юнита и при необходимости сменить количество удалять здание и создавать новое возвращая выделение и количество юнитов с 1 по 11
можно сделать полноэкранную таверну с помощью дгуи
имхо последнее лучше всего будет Sucsonius:
который обходит данную проблему
костыли не обходят проблему
они извращают всё таким образом что проблема не заметна на фоне этих костылей
если тебе надо обойти проблему то пиши новый вар3
Sucsonius, через скилы реализовать покупку/продажу юнитов(все действия описывать триггерно, а инфу показывать в мультибоарде)
ещё можно отдать дамми герою приказ на покупку и таким образом уменьшать
можно создать кучу зданий с разным количеством двенадцатого юнита и при необходимости сменить количество удалять здание и создавать новое возвращая выделение и количество юнитов с 1 по 11
можно сделать полноэкранную таверну с помощью дгуи
имхо последнее лучше всего будет Sucsonius:
который обходит данную проблему
костыли не обходят проблему
они извращают всё таким образом что проблема не заметна на фоне этих костылей
если тебе надо обойти проблему то пиши новый вар3
void - это nothing то есть ничего не возвращает функция, а саму функции называют doTheThing, а unit u - аргументы функции, мануалы про cjass почитай (хотя я тоже соглашусь, что написано очень плохо в мануалах. Нужно попробовать немного самим пописать коды)
можно представить как (если хорошо понимаешь jass)
function doTheThing takes unit u returns nothing
... //что-то делаешь с юнитом u (берем аргумент функции - unit u)
endfunction
GetMyUnit - такой не существует, видимо Док имеет в виду подставить свою переменную
пример
например составил пример функции - определить уровень абилы юнита. Функция называется LV, u - юнит, id - целое число, равкод абилы. Возвращает целое число (уровень абилы).
function LV takes unit u, integer id returns integer
return GetUnitAbilityLevel(u, id)
endfunction
'A000' - равкод абилы
local integer lv = LV(GetTriggerUnit(), 'A000') //узнаем уровень героя
Урон настраивается через уровень способности, или как было сказано unit - damage target
команда для использования нестандартной способности берется от той способности, на основе которой ты её сделал, и если это цепь тралла - Unit - issue order with targetign a unit - orc - chain lighting
И в правду рак мозга...
Статьи почитать не судьба? Некоторые предметные способности не повышают уровень - точнее эффект от повышения уровня не изменяется, посему делают 5 (100500) способностей с разными бонусами и выдаются юниту в нужный момент.
Способность маски соби - повышает базовый реген маны и бонус от интеллекта, так что крипам с 0 манарегена эта способность ничего не добавит.
Собственные попытки в студию, что не получается?
Напомним - ЭТО НЕ СТОЛ ЗАКАЗОВ, здесь задают вопросы про реализацию тех или иных вопросов, спрашивают про ошибки, оптмизацию, отдельные функции. Я не увидел в вашем вопросе ничего кроме невнятного описания механики способности, " вокргу кого то там огненные столбы возникают, и еще порча"...
тебе нужен не уровень героя, а уровень способности
здоровье нужно устанавливать на текущее здоровье триггеринг юнит + нужное число + уровень способности твоей абилы умножить на нужное число (там сам смотри, сколько она дамажит)
убери вейт, нормальный таймер ты все равно сейчас не раскуришь, пусть хилит мгновенно после каста, чуть некрасиво, зато относительно нормальный код получится
//////////
в идеале вообще любой такой отхил элементарно делается на вешание событий получения урона кому надо и при них и отхил наносящего, там как раз и отхилится именно на сколько нанёс, а не как у тебя, но это ты имхо опять же еще не раскуришь
Уже решил.для тех кто будет искать данный вопрос - можно использовать свиток регенерации(Раса:люди),он игнорирует сколько у вас хп и имеет длительность.
Создаешь триггер, в событие ставишь период и в действия - изменение переменной. Хз в чём тут может быть трабл. Событие - "время - periodic", Действие - "set variable". Или как-то так. Первое найти легко, там список всего ничего, а второе так и вовсе четвертая строчка (если не ошибаюсь).
Совсем забыл - xgm.guru/p/wc3/articles
Хеш-таблица в которую ты будешь запоминать всех кто сел на корабль или группа. Короче, любое место в котором можно хранить несколько юнитов. При погружении на корабль, запоминаешь юнита. Удаляешь его из игры. Потом в нужный момент моздаешь такого же.Или просто выгружаешь и скрываешь, в нужный момент потом просто передвинуть и показать этого юнита. Вот и все...
Но для начала переведи текстуру в формат jpg\png, далее волшебной палочкой двойным щелчком повыделяй нужный\ нужные тебе сегменты для перекраски. Залей их нужным тебе цветом. Сохрани в png. Экспортируй png => blp.
И всё!
Всё что тебе понадобится: скаченный BLP laboratory, war3ModelEditor
и pixlr.com/editor/?loc=ru?loc=ru
DazzleFirst, возможно ли как то создать локальный триггер при применении способности и уничтожить обратно?
ведь обычно локальные триггеры как правило при применении способности создаются в инициализации карты...
нет нужды выделять еще один триггер (помимо отлова) на заклинание, если оно не слишком громоздкое в плане исполнения.
Как сообщает товарищ nvc123:
Zeuz, лучше не использовать много триггеров
вообще нету такой ситуации в которой надо много триггеров
стоит обратить на это внимание. Везде и всюду есть свои нюансы которые нужно учитывать. Если не выполнить задуманное с помощью одного триггера, то делаем два.
Megacomp, это не джасс а вджасс
проверь включен ли у тебя джассхелпер
так же не забывай что перед тем как нажать "проверка карты" карту нужно сохранить
Ну можно координаты камеры игрока. Но там нужен синк в кеше, чтобы небыло десинха, а это уже ни ГУИ.
Вот примитивный пример получение и сохранения координат камеры игрока:
scope PlayerRelated initializer InitPlayers
globals
force AllPlayers = null
trigger gg_trg_PlayerLeft = null
playerevent bj_enumPlayerEventId = null
player array PL
gamecache data
endglobals
function TriggerRegisterPlayerEventEnum takes nothing returns nothing
call TriggerRegisterPlayerEvent( bj_destInRegionDiesTrig, GetEnumPlayer( ), bj_enumPlayerEventId )
endfunction
function TriggerRegisterForceEvent takes trigger trig, force forforce, playerevent id returns nothing
set bj_destInRegionDiesTrig = trig
set bj_enumPlayerEventId = id
call ForForce( forforce, function TriggerRegisterPlayerEventEnum )
endfunction
function Trig_Player_Left_Actions takes nothing returns nothing
call ForceRemovePlayer( AllPlayers, GetTriggerPlayer( ) )
endfunction
function IsSlotPlayer takes player pl returns boolean
return GetPlayerSlotState( pl ) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController( pl ) == MAP_CONTROL_USER
endfunction
function InitPlayers takes nothing returns nothing
set AllPlayers = CreateForce( )
set gg_trg_PlayerLeft = CreateTrigger( )
set data = InitGameCache( "Data.w3v" )
set bj_forLoopAIndex = 0
loop
exitwhen bj_forLoopAIndex > bj_MAX_PLAYERS
set PL[bj_forLoopAIndex] = Player( bj_forLoopAIndex )
if IsSlotPlayer( PL[bj_forLoopAIndex] ) then
call ForceAddPlayer( AllPlayers, PL[bj_forLoopAIndex] )
call TriggerRegisterPlayerEvent( gg_trg_PlayerLeft, PL[bj_forLoopAIndex] , EVENT_PLAYER_LEAVE )
endif
set bj_forLoopAIndex = bj_forLoopAIndex + 1
endloop
call TriggerAddAction( gg_trg_PlayerLeft, function Trig_Player_Left_Actions )
endfunction
endscope
function Trig_Get_Player_Screen_Cord_Conditions takes nothing returns boolean
return true
endfunction
function Trig_Get_Player_Screen_Cord_Actions takes nothing returns nothing
local player pl = GetTriggerPlayer( )
local real dx = 0.00
local real dy = 0.00
if GetLocalPlayer( ) == pl then
set dx = GetCameraEyePositionX( )
set dy = GetCameraEyePositionY( )
else
set dx = 0.00
set dy = 0.00
endif
call StoreReal( data, "Cord", "X", dx )
call StoreReal( data, "Cord", "Y", dy )
call TriggerSyncStart( )
if GetLocalPlayer( ) == pl then
call SyncStoredReal( data, "Cord", "X" )
call SyncStoredReal( data, "Cord", "Y" )
endif
call TriggerSleepAction( 2.00 )
call TriggerSyncReady( )
set dx = GetStoredReal( data, "Cord", "X" )
set dy = GetStoredReal( data, "Cord", "Y" )
// далее делаем с коорданатами камеры что хочется!
call PingMinimapEx( dx, dy, 3.00, 255, 255, 255, true )
endfunction
//===========================================================================
function InitTrig_Get_Player_Screen_Cord takes nothing returns nothing
set gg_trg_Get_Player_Screen_Cord = CreateTrigger( )
set bj_forLoopAIndex = 0
loop
exitwhen bj_forLoopAIndex > bj_MAX_PLAYERS
if IsPlayerInForce( PL[bj_forLoopAIndex], AllPlayers ) then
call TriggerRegisterPlayerChatEvent( gg_trg_Get_Player_Screen_Cord, PL[bj_forLoopAIndex], "-GetCord", true )
endif
set bj_forLoopAIndex = bj_forLoopAIndex + 1
endloop
call TriggerAddCondition( gg_trg_Get_Player_Screen_Cord, Condition( function Trig_Get_Player_Screen_Cord_Conditions ) )
call TriggerAddAction( gg_trg_Get_Player_Screen_Cord, function Trig_Get_Player_Screen_Cord_Actions )
endfunction
ScopteRectuS, Переменные инициализируются при инициализации карты, она же вроде как глобальная udg_HeroGFL_owner. Или в коде карты насильно инициализировать?
Они же не локалки ScopteRectuS, м, реально null возвращает боевая единицы. Смешно. Окей: И как ему определить созданную во время игры боевую единицу?
Это из-за физического размера выбираемых воинов.
Если хотите сделать способность, которая будет работать также, как и стандартные, то при выборе воинов в качестве радиуса указываете нужный радиус + максимально возможный физический размер воинов на карте.
// Если перебор воинов идёт через цикл:
call GroupEnumUnitsInRange( group, x, y, SPELL_RADIUS + MAX_COLLIZION_SIZE, boolexpr )
loop
// ...
set enumUnit = FirstOfGroup( group )
// ...
if IsUnitEnemy( enumUnit, player ) and IsUnitInRangeXY( enumUnit, x, y, SPELL_RADIUS ) then
call DoSomething( )
endif
// ...
endloop
Как показано выше, с помощью функции IsUnitInRange( ) мы можем отсеять воинов, которые не попали в радиус действия способности, но были выбраны в группу из-за того, что мы указали в функции GroupEnumUnitsInRange( ) радиус чуть больше нужного нам.
да, сейчас вообще обратил внимание что текстуры идущие в комплекте не воспринимаются почему-то, а именно "Shield.blp".
Все равно проблема не решилась, вроде бы смог заменить текстуру, которую не видел но варик не воспринимает модель.
1
Для отображения интерфейса необходима только модель, не нужно для ее роботы новых текстур.
ВарКрафт ссылается на модели для отображения гемплея, а в свою очередь модели ссылаются на текстуры.
Хитрость в том что можна создавать 15 моделей с одинаковыми текстурами.
Trickster, ну так будет 100р?
В карте испоганен заголовок и хешьтаблица и удалены данные об обьектах, поэтому она не открывается ничем кроме зезулы, но зезула не дает возможность редактировать файлы. Ну собственно я это дело снял, могу восстановить открываемость в редакторе..
Первая рпгшка со слабой hex защитой, повреждение заголовка, спокойно открывается что ладиком что RMPQ, код смесь гуи + vjass систем, данные о войсках на карте и триггерах удалены, в коде не сжаты имена (автор не знает про тулы векса), вторая карта тоже самое.
Сломать их раз плюнуть, рассказывать как и зачем я не буду, инфы пруд пруди.
>> IssueInstantTargetOrder: The only use of this function is to make units give items from their inventory to other units. The order in this case would be smart, the target widget is the item and the instant target widget is the target unit. The ordered unit will then move towards the target unit and hand the item over.
>>These natives have terribly confusing names, but I've heard that they are for manipulating items. I.e. Give this item (one widget argument) to this unit (another widget argument) or drop it at this point. I don't know which argument is the item and which is the target unit though.
гугл помог, а память подвела, покупка через Neutral* приказы делается
852000 (skillmenu): Приказ (без указания цели), при выполнении которого открывается меню навыков героев. Если же триггерно заставить выполнить этот приказ обычную боевую единицу, то исчезнет ее карта команд, которая возвратится, если выбрать боевую единицу.
851994 (buildmenu): Приказ (без указания цели), открывающий меню строительства воина, способного возводить здания.
Но эти приказы 852000 и 851994 не ловятся при нажатии, эти приказы нужно чтобы отдать боевой единице открыть меню скилов или строительства, а вот отловить не получится.
Число зависит от слота инвентаря, в котором лежит использованный предмет
Кстати не знаю как у других, а у меня оглушенный юнит игнорирует приказы и триггер их не ловит
Интересно зачем? Вы в курсе что это номер по которому движок ищит в списке что ему делать а еше куда рисовать кулдаун и прочее? Есть ограниченное число приказов и вся нужны, изменять ид приказа абилкам - бесполезно, исключение канал и поставка ресурсов - там есть отдельный обработчик, который смотрит что база канал а после уже идет все остальное. Каналу id приказа меняем из соображения кулдауна на панели приказа, остальное, другое применение у id приказа нет.
Лимит операций, обычно это беда настигает заядлых гуишников.
На jass обычно нету таких проблем.
Создайте таймер с периодом .00 сек и запускайте им функции инициализации триггеров.
функция типа InitTrig_Имя триггера - это функция инициализации триггера, она вызывается из функции InitCustomTriggers, но если этих вызовов очень много то функция упирается в лимит операций и поток завершается так и не создав все триггеры.
» WarCraft 3 / Импорт Модели Дерева
» WarCraft 3 / Поворот Юнита
» WarCraft 3 / Краши и вылеты из-за триггера.
» WarCraft 3 / Триггер союза
» WarCraft 3 / Тип склона
» WarCraft 3 / Помогите найти ворота
» WarCraft 3 / Продажа юнита
» WarCraft 3 / Равкод 'A00\'
» WarCraft 3 / Продажа юнита
» WarCraft 3 / Условие технология
» WarCraft 3 / вопрос по удалению спецэффектов
» WarCraft 3 / Способность через триггер
» WarCraft 3 / Способность с целью - иллюзия
» WarCraft 3 / Как сделать стандартного воина героем?
» WarCraft 3 / Погрузить на корабль
» WarCraft 3 / Вопрос по моделированию
» WarCraft 3 / вопрос по моделированию
» WarCraft 3 / Глобальная карта
» WarCraft 3 / Область с воздействием на юнита
» WarCraft 3 / Что не так с моделями?
» WarCraft 3 / Интерфейс разных рас
» WarCraft 3 / как открыть карту в редакторе?
» WarCraft 3 / Id приказа
» WarCraft 3 / Про отряды
» WarCraft 3 / Немного про return